home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / DesktopDoubler / Nub / DisplayManager.c < prev    next >
Text File  |  1999-06-26  |  4KB  |  265 lines

  1. #define DISABLE_LOCAL_CALLTRACE        1        // Set to 1 to disable Call Traces for this file.
  2. #define DISABLE_LOCAL_DEBUG            0        // Set to 1 to disable all debugging for this file.
  3. #include "DebugUtils.h"
  4.  
  5. #include <Displays.h>
  6. #include <Errors.h>
  7. #include <LowMem.h>
  8. #include "ContextUtils.h"
  9. #include "Display.h"
  10. #include "DisplayManager.h"
  11.  
  12.  
  13.  
  14.  
  15.  
  16. DisplayManager::DisplayManager(void)
  17. {
  18.     fMainDevice = NULL;
  19.     fCloneDevice = NULL;
  20.     fDisplayCount = 0;
  21.     fCloneDisplay = NULL;
  22.     fCurDisplay = NULL;
  23.     fMBarTracker = NULL;
  24.     fDMNotifierInstalled = false;
  25. }
  26.  
  27.  
  28.  
  29.  
  30.  
  31. DisplayManager::~DisplayManager(void)
  32. {
  33.     Display        *display;
  34.     
  35.     
  36.     while((display = fDisplayList.Pop()) != NULL)
  37.     {
  38.         display->Destroy();
  39.         delete display;
  40.     }
  41. }
  42.  
  43.  
  44.  
  45.  
  46.  
  47. OSStatus DisplayManager::Initialize(UInt32 numVirtualDisplays)
  48. {
  49.     Display                *display;
  50.     UInt32                index;
  51.     OSStatus            err;
  52.     
  53.     
  54.     // Sanity checks.
  55.     dAssert(numVirtualDisplays >= 2);
  56.     if (numVirtualDisplays < 2)
  57.         numVirtualDisplays = 2;
  58.     
  59.     // Save this for later...
  60.     fDisplayCount = numVirtualDisplays;
  61.     fMainDevice = GetMainDevice();
  62.     fCloneDevice = fMainDevice;
  63.     
  64.     // Create clone display for the main device.
  65.     display = new Display(0);
  66.     dAssert(display != NULL);
  67.     if (display == NULL)
  68.         return memFullErr;
  69.     
  70.     err = display->Create(fCloneDevice,NULL,true);
  71.     if (err != noErr)
  72.     {
  73.         dprintf(kDConPrefix "Display::Create failed: %ld",err);
  74.         return err;
  75.     }
  76.     
  77.     fDisplayList.Append(display);
  78.     fCloneDisplay = display;
  79.     fCurDisplay = display;
  80.     
  81.     // Create the virtual displays
  82.     for (index = 1;index < numVirtualDisplays;index += 1)
  83.     {
  84.         err = AddDisplay(index);
  85.         if (err != noErr)
  86.         {
  87.             dprintf(kDConPrefix "DisplayManager::AddDisplay failed: %ld",err);
  88.             return err;
  89.         }
  90.     }
  91.     
  92.     fCurDisplay->ShowHide(false);    
  93.     return noErr;
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100. void DisplayManager::Idle(Point where)
  101. {
  102.     Display        *display;
  103.     
  104.     
  105.     // Check for display switch.
  106.     display = FindDisplay(where);
  107.     dAssert(display != NULL);
  108.     if (display != GetCurDisplay())
  109.         Swap(display);
  110. }
  111.  
  112.  
  113.  
  114.  
  115.  
  116. void DisplayManager::Swap(Display *display)
  117. {
  118.     // Sanity checks.
  119.     dAssert(display != NULL);
  120.     if (display == NULL)
  121.         return;
  122.     
  123.     // Check for easy out.
  124.     if (display == fCurDisplay)
  125.         return;
  126.     
  127.     dprintf(kDConPrefix "Swap: from = $%08lX, to = $%08lX\n",fCurDisplay,display);
  128.     fCurDisplay->ShowHide(true);
  129.     fCurDisplay = display;
  130.     fCurDisplay->ShowHide(false);
  131. }
  132.  
  133.  
  134.  
  135.  
  136.  
  137. void DisplayManager::Refresh(void)
  138. {
  139.     fCurDisplay->ShowHide(true);
  140.     fCurDisplay->ShowHide(false);
  141. }
  142.  
  143.  
  144.  
  145.  
  146.  
  147. void DisplayManager::MBarClick(Display *display,Point where)
  148. {
  149.     Point        offset,base;
  150.     EvQElPtr    event;
  151.     OSStatus    err;
  152.     
  153.     
  154.     // Sanity checks.
  155.     dAssert(display != NULL);
  156.     if (display == NULL)
  157.         return;
  158.     
  159.     // Post a mouseDown in the real menu bar.
  160.     err = PPostEvent(mouseDown,0,&event);
  161.     dAssert(err == noErr);
  162.     if (err == noErr)
  163.     {
  164.         base = *(Point*)&(GetMainDevice())[0]->gdRect;
  165.         offset = display->GetOffset();
  166.         event->evtQWhere.h = where.h - (offset.h - base.h);
  167.         event->evtQWhere.v = where.v - (offset.v - base.v);
  168.     }
  169. }
  170.  
  171.  
  172.  
  173.  
  174.  
  175. void DisplayManager::SetMBarTracker(Point where,Boolean track)
  176. {
  177.     if (track)
  178.     {
  179.         fMBarTracker = FindDisplay(where);
  180.         dAssert(fMBarTracker != NULL);
  181.     }
  182.     else
  183.         fMBarTracker = NULL;
  184. }
  185.  
  186.  
  187.  
  188.  
  189.  
  190. void DisplayManager::OffsetMBarMouse(Point *where)
  191. {
  192.     Point    offset,base;
  193.     
  194.     
  195.     if (fMBarTracker != NULL)
  196.     {
  197.         base = *(Point*)&(GetMainDevice())[0]->gdRect;
  198.         offset = fMBarTracker->GetOffset();
  199.         where->h = where->h - (offset.h - base.h);
  200.         where->v = where->v - (offset.v - base.v);
  201.     }
  202. }
  203.  
  204.  
  205.  
  206.  
  207.  
  208. Display *DisplayManager::FindDisplay(Point where)
  209. {
  210.     Display        *display;
  211.     
  212.     
  213.     display = fDisplayList.GetFirst();
  214.     for (;display != NULL;display = display->next)
  215.         if (display->Contains(where))
  216.             return display;
  217.     
  218.     return NULL;
  219. }
  220.  
  221.  
  222.  
  223.  
  224.  
  225. Display *DisplayManager::FindDisplay(DisplayIDType displayID)
  226. {
  227.     Display        *display;
  228.     
  229.     
  230.     display = fDisplayList.GetFirst();
  231.     for (;display != NULL;display = display->next)
  232.         if (displayID == display->GetDisplayID())
  233.             return display;
  234.     
  235.     return NULL;
  236. }
  237.  
  238.  
  239. #if 0
  240. #pragma mark -
  241. #endif
  242.  
  243.  
  244. OSStatus DisplayManager::AddDisplay(UInt32 index)
  245. {
  246.     Display        *display;
  247.     OSStatus    err;
  248.     
  249.     
  250.     display = new Display(index);
  251.     dAssert(display != NULL);
  252.     if (display == NULL)
  253.         return memFullErr;
  254.     
  255.     err = display->Create(fCloneDevice,NULL,false);
  256.     if (err != noErr)
  257.     {
  258.         dprintf(kDConPrefix "Display::Create failed: %ld",err);
  259.         return err;
  260.     }
  261.     
  262.     fDisplayList.Push(display);
  263.     return noErr;
  264. }
  265.